# 封装数据库链接
# 安装pymysql库
import pymysql
# 导入封装好的日志模块
from common.logs import Logs

# 之前把日志记录器写在类里面时，会导致处理器重复被创建，日志会重复记录，现在挪到外面，就不会重复记录了
logger = Logs("数据库操作").get_logger()    # 创建日志记录器

# 数据库操作类
class Database:
    # 创建数据库连接对象时初始化
    def __init__(self, type):
        self.db_type = type     # 根据类型判断要连接哪个数据库
        try:
            if self.db_type == 'qxdj':      # 连接轻喜商城数据库
                self.conn = pymysql.Connection(
                    host='10.13.10.53',
                    port=3306,
                    user='tester',
                    password='AY^1F6pZlkVx9jqd'
                )
                logger.debug(f"[{self.db_type}]数据库连接成功！")

            elif self.db_type == 'ddd':     # 连接单多多数据库
                self.conn = pymysql.Connection(
                    host='10.13.10.17',
                    port=3307,
                    user='caimiaoge',
                    password='OuiMieANALUaKeD'
                )
                logger.debug(f"[{self.db_type}]数据库连接成功！")

            self.cur = self.conn.cursor()  # 数据库连接成功 设置游标

        except Exception as e:      # 数据库连接失败时，返回失败原因
            logger.debug(f"[{self.db_type}]数据库连接失败！失败内容：{e}")
            # print(f"数据库连接失败！失败内容：{e}")

    # 查询操作
    def selectDB(self, db_name, sql):
        try:
            self.conn.select_db(db_name)     # 选择需要操作的数据库名称
            self.cur.execute(sql)       # 提交查询语句
            select_result = self.cur.fetchall()    # 查询结果以元组形式返回，存储查询的内容，可以给后续函数提供提取变量

            logger.info(f"[{self.db_type}]查询语句：{sql}")
            logger.info(f"[{self.db_type}]查询结果：{select_result}")
            # print(f"查询数据库成功！查询结果为：{self.select_result}")

            return select_result

        except Exception as e:
            logger.info(f"查询数据库失败！检查sql语句是否正确！错误信息为：{e}")
            # print(f"查询数据库失败！检查sql语句是否正确！错误信息为：{e}")

    # 更新操作
    def updateDB(self, db_name, sql):
        try:
            self.conn.select_db(db_name)    # 选择需要操作的数据库名称
            update_rows = self.cur.execute(sql)    # 存储这次更新影响的行数
            self.conn.commit()      # 连接数据库的时候没有设置自动提交事务，这里需要手动提交一次

            logger.debug(f"[{self.db_type}]更新数据库成功！本次操作影响了{update_rows}行数据")
            # print(f"更新数据库成功！本次操作影响了{update_rows}行数据")
            return update_rows

        except Exception as e:
            logger.error(f"[{self.db_type}]更新数据库失败！检查sql语句是否正确！错误信息为：{e}")
            # print(f"更新数据库失败！检查sql语句是否正确！错误信息为：{e}")

    # 新增操作
    def insterDB(self, db_name, sql):
        pass

    # 删除操作
    def deleteDB(self, db_name, sql):
        try:
            self.conn.select_db(db_name)  # 选择需要操作的数据库名称
            delete_rows = self.cur.execute(sql)  # 存储这次删除影响的行数
            self.conn.commit()  # 连接数据库的时候没有设置自动提交事务，这里需要手动提交一次

            logger.debug(f"[{self.db_type}]删除数据库成功！本次操作影响了{delete_rows}行数据")
            # print(f"删除数据库成功！本次操作影响了{delete_rows}行数据")

            return delete_rows

        except Exception as e:
            logger.debug(f"[{self.db_type}]删除数据库失败！检查sql语句是否正确！错误信息为：{e}")
            # print(f"删除数据库失败！检查sql语句是否正确！错误信息为：{e}")

    # 关闭数据库连接
    def closeDB(self):
        self.cur.close()        # 关闭游标
        self.conn.close()       # 关闭数据库连接
        logger.debug(f"[{self.db_type}]关闭游标和数据库连接")


if __name__ == '__main__':
    db = Database('qxdj')
    select_sql = "SELECT * FROM `open_base`.`base_account` " \
                 "WHERE `user_id` = '1668827193421848577'"
    result = db.selectDB('open_base', select_sql)
    db.closeDB()

    db_1 = Database('ddd')
    updata_sql = "UPDATE `open_kamaitachi`.`worker_user_info` " \
                 "SET `document_status` = 0 WHERE `id` = 529787"
    rows = db_1.updateDB("open_kamaitachi", updata_sql)
    db_1.closeDB()







